/* Copyright (C) 2007 Notyet

这是algebra库的一部分。

algebra是一个基于C开发的库，旨在解决代数式化简与解简单方程的问题。

联系方式：
E-Mail:nt1900@gmail.com  */
/*
从版本12开始FORMULA有重大改变。
s_letter的 power 由FORMULA* 变为int，简化处理，降低复杂度
失去的功能拟在function功能完善后改由函数处理。
*/

#ifndef _ALG_FORMULA_H_
#define _ALG_FORMULA_H_				//防止多次定义 

//---------------------------
typedef unsigned int NUM;
typedef unsigned int ID;
typedef struct s_chain CHAIN;
typedef struct s_formula FORMULA;
//---------------------------
struct s_chain
{
	FORMULA* term;
	CHAIN* next;
};
//---------------------------
// f(x)
struct s_function
{
	ID func_id;
	FORMULA* arguments;
};

// x^a
struct s_letter
{
	ID letter_id;			//字母
	int power;				//幂
};

// a/b
struct s_fraction
{
	NUM numerator;				//分子
	NUM denominator;			//分母
};

// (radical a)b
struct s_radical
{
	NUM radicand;				//被开方数
	NUM root;				//根指数
};

// a1+a2+a3...an
struct s_terms
{
	CHAIN* head;				//头指针
	//注意：下面的成员不是必须的，
	//	添加他们是为了提高速度。
	//	公用体空间不用白不用。
	//unsigned int count;
};

struct s_formula
{
	unsigned char attr;				//属性
	union
	{
		struct s_function function;
		struct s_letter letter;
		struct s_fraction fraction;
		struct s_radical radical;
		struct s_terms terms;
	}data;
	FORMULA* coefficient;			//系数
};
/* attr详解(高位到低位)
 * (1)该项符号位 0正1负
 * (2)该项倒数位（乘除位） 0乘1除
 * (3)保留位
 * (4)保留位
 * (5)--
 * (6) +-该项
 * (7) +-类型位
 * (8)--
 */
 
//---------------------------define
#define FORMULA_ATTR_TERMS	0x0
#define FORMULA_ATTR_FRACTION	0x1
#define FORMULA_ATTR_RADICAL	0x2
#define FORMULA_ATTR_LETTER	0x3
#define FORMULA_ATTR_FUNCTION	0x4

#define FORMULA_ATTR_NEG	0x80
#define FORMULA_ATTR_REC	0x40

#define FORMULA_LOW_MASK	0x0F
#define FORMULA_HIGH_MASK	0xF0

//---------------------------check
#define alg_check_formula_attr(attr) (FORMULA_LOW_MASK&&(attr))

#ifdef __cplusplus
extern "C" {
#endif
//---------------------------init
DLLIMPORT extern void		alg_formula_init();
//---------------------------create&destroy
DLLIMPORT extern FORMULA*	alg_create_formula(char attr);
DLLIMPORT extern int		alg_destroy_formula(FORMULA* fml);
DLLIMPORT extern CHAIN*	alg_create_term(FORMULA* term);
DLLIMPORT extern int		alg_destroy_term(CHAIN* chn);
DLLIMPORT extern int		alg_destroy_terms(CHAIN* head);
//---------------------------compute
DLLIMPORT extern int		alg_add(FORMULA* dsc,FORMULA* src);
DLLIMPORT extern int		alg_mul(FORMULA* dsc,FORMULA* src);
DLLIMPORT extern int		alg_neg(FORMULA* obj);
DLLIMPORT extern int		alg_rec(FORMULA* obj);
DLLIMPORT extern int		alg_format(FORMULA* obj);
//---------------------------simplification
DLLIMPORT extern int		alg_simplification(FORMULA* obj);
DLLIMPORT extern int		alg_simp_redution();
DLLIMPORT extern int		alg_simp_rational();
DLLIMPORT extern int		alg_combine_like_terms(FORMULA* obj);
#ifdef __cplusplus
}
#endif

#endif /* _ALG_FORMULA_H_ */
